///////////////////////////////////////////////////////////////////////////////////////////////////
// Illusion Ray Development Kit (IDK)           Copyright (c) 2010 ( dimitriy.martynenko@gmail.com )
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2010-05-22
// Updated : ...
// Licence : NEW BSD
// Info	   : IDK Engine
///////////////////////////////////////////////////////////////////////////////////////////////////
class TModuleManager : public TObject, virtual public IModuleManager
{
	IDKClass;
private:
protected:
	void DoInit(void);
	void DoStart(void);
	void DoFinish(void);
	void DoUpdate(float dt);
	//
	typedef ref<IModule> RefModule;
	typedef SortList<RefModule> ModuleItem;
	Array<RefModule> LoadModules(Array<String>& modulesName);
protected: //IModuleManager Impl
	virtual void SendEvent(const Event& evnt);
protected: //Helper Specialization module
	void SetModule(const ModuleEventInitialize& evnt);
protected:
	SortList<RefModule> mModules;
public:
	class TSortModule;
public:
	TModuleManager();
public:
	void Init(void);
	void Start(void);
	void Stop(void);
	void Update(float dt);
	void Active(bool);
	void Lock(bool reset);
	void Unlock(void);
	ref<IDK::IRenderContext> GetRenderer(void);
	ref<IDK::ICore> GetCore(void);
private:
	ref<IDK::IRenderContext> mRenderContext;
	ref<IDK::ICore> mCoreContext;
};

typedef ref<TModuleManager> ModuleManager;

/*-------------------------------------------------------------------------
| TSortModule:
| ------------
| Sort
---------------------------------------------------------------------------*/
class TModuleManager::TSortModule : public TSortList<RefModule>::ISortComparer
{
public:
	virtual bool Sort(RefModule item1, RefModule item2);
};